МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
Звіт до лабораторної роботи № 4
з дисципліни: “ Системи запису та відтворення інформації ”
Мета роботи:
Набути вміння розробляти власні методи стиснення зображень та оцінювати їх ефективність.
Повний текст завдання:
Ознайомитись з теоретичним матеріалом.
Завантажити файл зображення вказаний в завданні (табл. 2) відповідно до свого варіанту.
Вивести основну інформацію про файл: кількість пікселів по горизонталі і вертикалі, тип зображення – кольорове/монохромне, кількість біт на піксел, загальний розмір зображення в бітах.
Написати JPEG-подібний кодер, згідно етапів розглянутих в теоретичній частині, який би стискав зображення з заданим степенем стиску G .
Вивести на екран оригінальне та декомпресоване зображення для порівняння їх якості.
Розрахувати реальну степінь стиснення зображення.
Навести покрокові результати всіх етапів стиснення та відтворення довільного блоку 8х8 пікселів Вашого зображення.
Варіант
Назва файлу
G
4
Flowrs1.tiff
21
Лістинг програми:
clear all;
Y = imread('D:\Політех\ІІІ курс\С-ми запису і відтворення інф\Photo\flowers1.tiff');
info = imfinfo('D:\Політех\ІІІ курс\С-ми запису і відтворення інф\Photo\flowers1.tiff');
%Визначити розміри матриці Y можна функцією size
[N, M] = size(Y);
%кількість блоків 8х8 по вертикалі та горизонталі
N_Block = fix(N / 8);
M_Block = fix(M / 8);
%Якщо кількість рядків або стовпців матриці не кратна 8, матрицю Y потрібно доповнити
if (N - N_Block * 8) ~= 0
Dod = 8 - ((N - N_Block * 8));
Y = [Y; zeros(Dod, M)];
N_Block = N_Block + 1;
end;
if (M - M_Block * 8) ~= 0
Dod = 8 - ((M - M_Block * 8));
Y = [Y zeros(N_Block * 8, Dod)];
M_Block = M_Block + 1;
end;
%зсув рівня
Y1 = double(Y) - 128;
%розбиття зображення на блоки
Y_DCT = blkproc(Y1, [8, 8], 'dct2');
G = 25;
for ii = 1 : 8
for jj = 1 : 8
Q_Table(ii, jj) = 1 + (ii + jj - 1) * G;
end;
end;
for ii = 1 : N_Block
for jj = 1 : M_Block
Y_Q ((8 * ii - 7) : (8 * ii), (8 * jj - 7) : (8 * jj)) = round(Y_DCT((8 * ii - 7) : (8 * ii), (8 * jj - 7) : (8 * jj)) ./ Q_Table);
end;
end;
Y_Scan = zeros(N_Block * M_Block, 64);
count = 1;
for j = 1 : N_Block
for i = 1 : M_Block
% Читаємо черговий блок 8х8 коефіцієнтів
x = Y_Q(8 * j - 7 : 8 * j, 8 * i - 7 : 8 * i);
% ZigZag перестановка
ZigZag = [x(1,1) x(1,2) x(2,1) x(3,1) x(2,2) x(1,3) x(1,4) x(2,3) ,...
x(3,2) x(4,1) x(5,1) x(4,2) x(3,3) x(2,4) x(1,5) x(1,6) x(2,5) x(3,4) ,...
x(4,3) x(5,2) x(6,1) x(7,1) x(6,2) x(5,3) x(4,4) x(3,5) x(2,6) x(1,7) ,...
x(1,8) x(2,7) x(3,6) x(4,5) x(5,4) x(6,3) x(7,2) x(8,1) x(8,2) x(7,3) ,...
x(6,4) x(5,5) x(4,6) x(3,7) x(2,8) x(3,8) x(4,7) x(5,6) x(6,5) x(7,4) ,...
x(8,3) x(8,4) x(7,5) x(6,6) x(5,7) x(4,8) x(5,8) x(6,7) x(7,6) x(8,5) ,...
x(8,6) x(7,7) x(6,8) x(7,8) x(8,7) x(8,8)];
% Заносимо результат в матрицю Y_Scan
Y_Scan(count, :) = ZigZag;
count = count + 1;
end;
end;
delta = 0; midle = [];
for ii = 1 : N_Block * M_Block
% Читаємо АС-коефіцієнти поточного блоку
vect = Y_Scan(ii, 2 : 64);
n = 0; res = [];
for jj = 1 : 63
if vect(jj) == 0 % Якщо коефіцієнт рівний 0
n = n + 1; % Збільшуємо лічильник нулів n на 1
else
res = [res n vect(jj)]; % Інакше записуємо пару [n, АС(jj)]
n = 0; % Починаємо підрахунок нулів спочатку
end;
end;
res = [res 0 0]; % Додаємо символ завершеннЯ блоку
Y_C = [midle (Y_Scan(ii, 1) - delta) res]; % Дописуємо до res різницеве значеннЯ DC-коефіцієнта та записуємо у
delta = Y_Scan(ii, 1); % у вихідний масив Y_C
midle = Y_C;
end;
Bit_Count = 0;
for ii = 1 : len...